package cn.cihon.ubi.qorosauto.util;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import cn.cihon.ubi.qorosauto.util.DateUtil;

/**
 * 
 * 该类用于计算行程当日日出、日落时间
 * 
 * 参考衡山日出日落：
 * 
 * 1月	日出6:45	日落17:13 
 * 2月	日出6:25	日落17:32 
 * 3月	日出6:03	日落17:54 
 * 4月	日出5:39	日落18:19 
 * 5月	日出5:18	日落18:39 
 * 6月	日出5:07	日落18:50 
 * 7月	日出5:12	日落18:46 
 * 8月	日出5:29	日落18:29 
 * 9月	日出5:52	日落18:05 
 * 10月	日出6:16	日落18:41 
 * 11月	日出6:38	日落18:07 
 * 12月	日出6:50	日落18:10
 * 
 * @author guodawei
 *
 */

public class NightDriving {

	private Date startTimeOfTheDay;	// 当日起点时间
	private Date sunRiseTimeOfTheDay;	// 当日日出时间 
	private Date sunSetTimeOfTheDay;	// 当日日落时间
	private Date endTimeOfTheDay;	// 当日终点时间
		
	public NightDriving (Date recordTimestamp) {
		
		String dateStr = DateUtil.getDateStr(recordTimestamp);
		
		String startTimeOfTheDay = dateStr + " " + "0:00:00";
		
		this.startTimeOfTheDay = DateUtil.StrToDate(startTimeOfTheDay);
		
		this.sunRiseTimeOfTheDay = getSunRiseTimeOfTheDay(recordTimestamp);
		
		this.sunSetTimeOfTheDay = getSunSetTimeOfTheDay(recordTimestamp);
		
		String endTimeOfTheDay = dateStr + " " + "23:59:59";
		
		this.endTimeOfTheDay = DateUtil.StrToDate(endTimeOfTheDay);
	}

	/**
	 * 获得以整数表示的月份
	 * @param recordTimestamp
	 * @return
	 */
	private int getMonthInt(Date recordTimestamp) {
		int month;
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(recordTimestamp);
		month = calendar.get(Calendar.MONTH);
		return month;
	}

	/**
	 * 参考衡山日出日落时间获得当日日落时间的方法
	 * 1月	日出6:45	日落17:13 
	 * 2月	日出6:25	日落17:32 
	 * 3月	日出6:03	日落17:54 
	 * 4月	日出5:39	日落18:19 
	 * 5月	日出5:18	日落18:39 
	 * 6月	日出5:07	日落18:50 
	 * 7月	日出5:12	日落18:46 
	 * 8月	日出5:29	日落18:29 
	 * 9月	日出5:52	日落18:05 
	 * 10月	日出6:16	日落18:41 
	 * 11月	日出6:38	日落18:07 
	 * 12月	日出6:50	日落18:10
	 * @param recordTimestamp
	 * @return
	 */
	private Date getSunSetTimeOfTheDay(Date recordTimestamp) {
		int month = getMonthInt(recordTimestamp);
		String sunSetTime = null;
		switch (month) {
			case Calendar.JANUARY: sunSetTime = "17:13"; break;
			case Calendar.FEBRUARY: sunSetTime = "17:32"; break;
			case Calendar.MARCH: sunSetTime = "17:54"; break;
			case Calendar.APRIL: sunSetTime = "18:19"; break;
			case Calendar.MAY: sunSetTime = "18:39"; break;
			case Calendar.JUNE: sunSetTime = "18:50"; break;
			case Calendar.JULY: sunSetTime = "18:46"; break;
			case Calendar.AUGUST: sunSetTime = "18:29"; break;
			case Calendar.SEPTEMBER: sunSetTime = "18:05"; break;
			case Calendar.OCTOBER: sunSetTime = "18:41"; break;
			case Calendar.NOVEMBER: sunSetTime = "18:07"; break;
			case Calendar.DECEMBER: sunSetTime = "18:10"; break;
		}
		String dateStr = DateUtil.getDateStr(recordTimestamp);
		
		return DateUtil.StrToDate(dateStr + " " + sunSetTime + ":00");
	}

	/**
	 * 参考衡山日出日落时间获得当日日出时间的方法
	 * 1月	日出6:45	日落17:13 
	 * 2月	日出6:25	日落17:32 
	 * 3月	日出6:03	日落17:54 
	 * 4月	日出5:39	日落18:19 
	 * 5月	日出5:18	日落18:39 
	 * 6月	日出5:07	日落18:50 
	 * 7月	日出5:12	日落18:46 
	 * 8月	日出5:29	日落18:29 
	 * 9月	日出5:52	日落18:05 
	 * 10月	日出6:16	日落18:41 
	 * 11月	日出6:38	日落18:07 
	 * 12月	日出6:50	日落18:10
	 * @param recordTimestamp
	 * @return
	 */
	private Date getSunRiseTimeOfTheDay(Date recordTimestamp) {
		int month = getMonthInt(recordTimestamp);
		String sunRiseTime = null;
		switch (month) {
			case Calendar.JANUARY: sunRiseTime = "6:45"; break;
			case Calendar.FEBRUARY: sunRiseTime = "6:25"; break;
			case Calendar.MARCH: sunRiseTime = "6:03"; break;
			case Calendar.APRIL: sunRiseTime = "5:39"; break;
			case Calendar.MAY: sunRiseTime = "5:18"; break;
			case Calendar.JUNE: sunRiseTime = "5:07"; break;
			case Calendar.JULY: sunRiseTime = "5:12"; break;
			case Calendar.AUGUST: sunRiseTime = "5:29"; break;
			case Calendar.SEPTEMBER: sunRiseTime = "5:52"; break;
			case Calendar.OCTOBER: sunRiseTime = "6:16"; break;
			case Calendar.NOVEMBER: sunRiseTime = "6:38"; break;
			case Calendar.DECEMBER: sunRiseTime = "6:50"; break;
		}
		String dateStr = DateUtil.getDateStr(recordTimestamp);
		
		return DateUtil.StrToDate(dateStr + " " + sunRiseTime + ":00");
	}

	public Date getStartTimeOfTheDay() {
		return startTimeOfTheDay;
	}

	public Date getSunRiseTimeOfTheDay() {
		return sunRiseTimeOfTheDay;
	}

	public Date getSunSetTimeOfTheDay() {
		return sunSetTimeOfTheDay;
	}

	public Date getEndTimeOfTheDay() {
		return endTimeOfTheDay;
	}
	
}
